package com.geely.jdemo.genericmethod;

import org.junit.Test;

/**
 * 2.泛型方法辨析
 */
public class GenericMethod1 {
    public <T> T genericMethod(T... a) {
        return a[a.length / 2];
    }

    public void test(int x, int y) {
        System.out.println(x + y);
    }

    @Test
    public void mainTest() {
        test(2, 2);
        System.out.println(genericMethod(1, 2, 3));
        System.out.println(genericMethod("aa", "bb", "cc"));
    }

    static class Generic<T> {
        private T key;

        public Generic(T key) {
            this.key = key;
        }

        //虽然在方法中使用了泛型，但不是一个泛型方法
        //这只是类中的普通的成员方法，只不过它的返回值是声明泛型类已经声明的泛型
        //所以这个方法可以使用 T 这个泛型
        public T getKey() {
            return key;
        }

        //在类的声明中并未声明泛型 E ，所以在使用E做形参和返回值类型时，编译器会无法识别
//        public  E setKey(E key) {
//            this.key = key;
//        }
    }

    /**
     * 这是一个真正的泛型方法
     * 首先在public和返回值之间<T>必不可少，表明这是一个泛型方法并声明一个泛型T
     * 泛型数量也可以为任意多个
     *
     * @param generic
     * @param <T>
     * @param <K>
     * @return
     */
    public <T, K> T showKeyName(Generic<T> generic) {
        return (T) generic;
    }

}
